python3之爬虫代理IP的使用+建立代理IP池

爬虫代理IP的使用+建立代理IP池

代理IP的使用

  • 先了解一下百度百科定义的IP
    ???

  • 为什么要使用代理IP?
    反爬(反网络爬虫)

  • 示例:
    测试网址

http://httpbin.org/get

  • 用浏览器先访问测试网址下看看
    test

  • 再用我们写的代码简单请求一下网页看看

import requests
url='http://httpbin.org/get'

html=requests.get(url=url).text
print(html)
"""
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.23.0",
    "X-Amzn-Trace-Id": "Root=1-5ff704d4-3841771516040beb29f6066f"
  },
  "origin": "1.192.244.128",
  "url": "http://httpbin.org/get"
}
"""

疑惑???

“User-Agent”: “python-requests/2.23.0”

网站如何来判定是人类正常访问还是爬虫程序访问? —> 检查请求头!!!
我们是不是需要发送请求时重构一下User-Agent???
添加 headers参数!!!

那就使用fake_useragent 模块
让它伪造一个出来再试试

import requests
from fake_useragent import UserAgent
url='http://httpbin.org/get'

headers={'User-Agent':UserAgent().random}

html=requests.get(url=url,headers=headers).text
print(html)
"""
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6",
    "X-Amzn-Trace-Id": "Root=1-5ff7a4de-05f8d7bf49dfe85e3be31d79"
  },
  "origin": "1.192.244.128",
  "url": "http://httpbin.org/get"
}
"""

“User-Agent”: “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6”

添加好headers的参数就可以了吗?
这还不行吗!!!
study

一些网站不但检测 请求头
一个IP 异常请求频繁(访问频率过多) 封禁?

“origin”: “1.192.244.128”

这是一项就是博主的IP, 我怎么确定这就是我的IP呢?
查询一下:果真如此
在这里插入图片描述
找个免费的代理IP来包装下

  1. 定义
    代替你原来的IP地址去对接网络的IP地址
  2. 作用
    隐藏自身真实IP, 避免被封
  3. 获取代理IP网站
    快代理、全网代理、代理精灵、… …

这次加上代理IP再去请求下

import requests
from fake_useragent import UserAgent
url='http://httpbin.org/get'
headers={'User-Agent':UserAgent().random}

# 参数类型
# proxies
# proxies = {'协议': '协议://IP:端口号'}
proxies = {
            'http': 'http://{}'.format('8.129.28.247:8888'),
            'https': 'https://{}'.format('8.129.28.247:8888'),
        }

html=requests.get(url=url,headers=headers,proxies=proxies).text
print(html)
"""
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36",
    "X-Amzn-Trace-Id": "Root=1-5ff7a71d-10b181340f8dc04f7514dfba"
  },
  "origin": "8.129.28.247",
  "url": "http://httpbin.org/get"
}
"""

“origin”: “8.129.28.247”

这次和我们加入的IP一样, 而不是我们自己的IP直接去请求了
但这一个够用吗?
???
别着急往下看啦~~~

建立代理IP

构建一个IP
每次让它随机提供一个来请求不就解决一个IP请求频繁而导致封掉了
这样就达到我们想要的结果了

  • 定义一个测试函数
import requests
from fake_useragent import UserAgent

test_url = 'http://httpbin.org/get'

headers = {'User-Agent': UserAgent().random}

#                      参数 IP 地址
def test_proxy(proxy):
    '''测试代理IP是否可用'''
    proxies = {
        'http': 'http://{}'.format(proxy),
        'https': 'https://{}'.format(proxy),
    }
    # 参数类型
    # proxies
    # proxies = {'协议': '协议://IP:端口号'}
    # timeout 超时设置 网页响应时间3秒 超过时间会抛出异常
    try:
        resp = requests.get(url=test_url, proxies=proxies, headers=headers, timeout=3)
        
        # 查看状态码   
        if resp.status_code == 200:
            print(proxy, '\033[31m可用\033[0m')
            
        else:
            print(proxy, '不可用')


    except Exception as e:
        print(proxy, '不可用')

get一下HTTP状态码

完整代码

  • 本次涉及到xpath对此不了解的同学可以去了解博主之前的博客
  • 也可以去菜鸟教程自行了解一下
  • 本次以 快代理 提供的免费IP 获取为例
# 建立属于自己的开放代理IP池
import requests
import random
import time
from lxml import etree
from fake_useragent import UserAgent

class IpPool:
    def __init__(self):
        # 测试ip是否可用url
        self.test_url = 'http://httpbin.org/get'
        # 获取IP的 目标url
        self.url = 'https://www.89ip.cn/index_{}.html'

        self.headers = {'User-Agent': UserAgent().random}
        # 存储可用ip
        self.file = open('ip_pool.txt', 'wb')

    def get_html(self, url):
        '''获取页面'''
        html = requests.get(url=url, headers=self.headers).text

        return html

    def get_proxy(self, url):
     	'''数据处理  获取ip 和端口''' 
        html = self.get_html(url=url)
        # print(html)
       
        elemt = etree.HTML(html)
        
        ips_list = elemt.xpath('//table/tbody/tr/td[1]/text()')
        ports_list = elemt.xpath('//table/tbody/tr/td[2]/text()')

        for ip, port in zip(ips_list, ports_list):
            # 拼接ip与port
            proxy = ip.strip() + ":" + port.strip()
            # print(proxy)
            
            # 175.44.109.195:9999
            self.test_proxy(proxy)

    def test_proxy(self, proxy):
        '''测试代理IP是否可用'''
        proxies = {
            'http': 'http://{}'.format(proxy),
            'https': 'https://{}'.format(proxy),
        }
        # 参数类型
        # proxies
        # proxies = {'协议': '协议://IP:端口号'}
        # timeout 超时设置 网页响应时间3秒 超过时间会抛出异常
        try:
            resp = requests.get(url=self.test_url, proxies=proxies, headers=self.headers, timeout=3)
           # 获取 状态码为200 
            if resp.status_code == 200:
                print(proxy, '\033[31m可用\033[0m')
                # 可以的IP 写入文本以便后续使用
                self.file.write(proxy)
                
            else:
                print(proxy, '不可用')

        except Exception as e:
            print(proxy, '不可用')

    def crawl(self):
        '''执行函数'''
        # 快代理每页url 的区别
        # https://www.kuaidaili.com/free/inha/1/
        # https://www.kuaidaili.com/free/inha/2/
        # .......
		# 提供的免费ip太多
        # 这里只获取前100页提供的免费代理IP测试
        for i in range(1, 101):
            # 拼接完整的url
            page_url = self.url.format(i)
            # 注意抓取控制频率
            time.sleep(random.randint(1, 4))
            self.get_proxy(url=page_url)

        # 执行完毕关闭文本
        self.file.close()


if __name__ == '__main__':
    ip = IpPool()
    ip.crawl()

测试完这里博主的脸可能比较黑吧, 竟没几个可以用的!!!
由于提供的免费IP可用的机率很小
想构建自己的IP池的小伙伴, 可以去获取其它代理, 提供的免费代理IP.

这里给大家提供几个博主当时测试时可以使用的IP
nice

159.203.44.177:3128

203.202.245.62:80

8.210.88.234:3128

89.187.177.106:80

89.187.177.106:80

96.113.165.182:3128

IP的响应速度根据你机器所在的地理位置不同而有差异

作者:淮南子.
来源:CSDN
版权声明:本文为博主原创文章,原创不易,请尊重原创转载请附上博文链接!
在这里插入图片描述

  • 55
    点赞
  • 246
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
python编写的爬虫代理ip.zip 运行环境 python3 和mysql数据库 下载使用 下载源码 git clone .git 或者在下载zip文件 安装依赖 pip install -i https://pypi.douban.com/simple/ -r requments.txt 创建数据库 mysql -uroot -p create database ippool charset=utf8; 配置项目 # ProxyIPPool/settings.py 基本的配置文件 # Database 使用mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ippool', # db name 'USER': 'root', # 用户名 'PASSWORD': 'password', # 密码 'HOST': 'localhost', 'PORT': 3306, } } # uwsgi.ini uwsgi.ini [uwsgi] # 监听的ip地址和端口 这里修改访问端口 http=0.0.0.0:8000 # 配置工程目录 项目所在的绝对路径 chdir=/path/to/proxy_ip_pool/ProxyIPPool/ # 配置项目的wsgi目录。相对于工程目录 wsgi-file=ProxyIPPool/wsgi.py 生成迁移文件和执行迁移文件 python manage.py makemigrations python manage.py migrate 启动 方法一 cd ProxyIPPool # 进入到manage.py这一级 python manage.py runserver # 启动后访问http://127.0.0.1:8000 方式二 # 使用uwgi 启动服务 这样可以后台启动 uwsgi --ini uwsgi.ini 可以使用方式一进行调试运行,方式二进行稳定运行 启动爬取代理ip的脚本 # 调试时运行 python run.py # 在服务器中可以运行  nohup python -u run.py >> crawler.out 2>&1 & 注意在项目下创建存储日志的文件 /ProxyIPPool/log/log.txt API接口 请求方式GET http://{运行服务器的ip}/api/fetch/ 随机返回一个代理ip信息 http://{运行服务器的ip}/api/random/{个数}, 随机返回指定个数 首页展示的内容可以在这里IPPool/views.py中修改 # IPPool/views.py # 修改context 改变返回首页的内容 def index(requests): """ 返回到说明页 :param requests: :return: """ context = '<h3>1.访问接口http://{运行服务器的ip}/api/fetch/ 随机返回一个代理ip信息</h3> <br/>' \ '<h3>2.访问接口http://{运行服务器的ip}/api/random/{个数}, 随机返回指定个数</h3> <br/>' return HttpResponse(context)
Python爬虫代理IP代理是一种在使用Python爬虫时,通过使用代理IP来隐藏真实的IP地址,以防止被目标网站封禁或限制访问。这样可以有效地绕过网站的反爬取技术,并且可以实现高强度、高效率地爬取网页信息而不给网站服务器带来过大的压力。 为了实现代理IP代理,可以按照以下步骤进行操作: 1. 首先,需要获取稳定的代理IP列表。可以参考相关博客或网站,如《python爬虫设置代理ip——方法(二)》,从中购买或获取代理IP。 2. 接下来,在Python代码中调用代理IP。可以使用以下代码获取代理IP列表并随机选择一个IP作为代理: ```python if __name__ == '__main__': url = 'http://www.xicidaili.com/nn/' ip_list = get_ip_list(url) proxies = get_random_ip(ip_list) print(proxies) ``` 其中,`get_ip_list()`函数用于获取代理IP列表,`get_random_ip()`函数用于从列表中随机选择一个IP作为代理。 通过以上步骤,就可以使用代理IP实现Python爬虫代理IP代理功能了。这样可以有效地绕过网站的反爬取技术,并且提高爬取效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python爬虫设置代理ip——方法(一)](https://blog.csdn.net/weixin_40372371/article/details/80154707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值